El tema escogido para el proyecto de la asignatura es el conjunto de datos extraído desde: https://github.com/fivethirtyeight/data/tree/master/comic-characters, correspondiente a los personajes de las principales casas del comic.
El informe de este kernel se componente en:
El paso inicial consiste en cargar las librerías y dependencias que requieren las funciones a utilizar.
Luego, creamos dos funciones auxiliares para uso posterior en el conjunto de datos, una para el cálculo de moda y otra para el cálculo de la década de aparición de los personajes.
################################################################
#FUNCION PARA CALCULO DE DECADA
floor_decade = function(value){ return(value - value %% 10) }
mi_moda<-function(var){
frec.var<-table(var)
valor<-which(frec.var==max(frec.var)) # Elementos con el valor máximo
names(valor)
}
################################################################La información de los personajes de los COMICS, está inicialmente dividida en 2 conjuntos de datos: “DC” y “MARVEL”, los cuales serán leídos, analizados, y posteriormente unidos en uno general.
dc <- read.csv(“dc-wikia-data.csv”) marvel <- read.csv(“marvel-wikia-data.csv”)
## [1] "C:/Users/Benjamin/OneDrive/Documentos/Master MIS/DATOS-DATASCIENCE/Proyecto/Comic-dataSet"
## [1] "allcomics-wikia-data.csv" "clasificacion_marca.csv"
## [3] "Comic-dataSet.bak.Rmd" "Comic-dataSet.bak1.Rmd"
## [5] "Comic-dataSet.html" "Comic-dataSet.Rmd"
## [7] "Comic-dataSet.Rproj" "dc-wikia-data.csv"
## [9] "Grupal.html" "Grupal.Rmd"
## [11] "marvel-wikia-data.csv" "prediccion_cantidad_apariciones.csv"
## 'data.frame': 6896 obs. of 13 variables:
## $ page_id : int 1422 23387 1458 1659 1576 1448 1486 1451 71760 1380 ...
## $ name : Factor w/ 6896 levels "3g4 (New Earth)",..: 598 6007 2488 3002 5280 6771 378 6289 1695 2185 ...
## $ urlslug : Factor w/ 6896 levels "\\/wiki\\/3g4_(New_Earth)",..: 598 6006 2488 3003 5279 6771 378 6288 1695 2185 ...
## $ ID : Factor w/ 4 levels "","Identity Unknown",..: 4 4 4 3 4 3 3 4 3 4 ...
## $ ALIGN : Factor w/ 5 levels "","Bad Characters",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ EYE : Factor w/ 18 levels "","Amber Eyes",..: 5 5 6 6 5 5 5 5 5 5 ...
## $ HAIR : Factor w/ 18 levels "","Black Hair",..: 2 2 5 18 2 2 3 2 3 3 ...
## $ SEX : Factor w/ 5 levels "","Female Characters",..: 4 4 4 4 4 2 4 4 2 4 ...
## $ GSM : Factor w/ 3 levels "","Bisexual Characters",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ ALIVE : Factor w/ 3 levels "","Deceased Characters",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ APPEARANCES : int 3093 2496 1565 1316 1237 1231 1121 1095 1075 1028 ...
## $ FIRST.APPEARANCE: Factor w/ 775 levels "","1935, October",..: 16 456 157 462 21 34 40 487 262 130 ...
## $ YEAR : int 1939 1986 1959 1987 1940 1941 1941 1989 1969 1956 ...
## page_id name
## Min. : 1380 3g4 (New Earth) : 1
## 1st Qu.: 44106 500-ZQ (New Earth) : 1
## Median :141267 A'Hwiirdh-Paan'A (New Earth): 1
## Mean :147441 A'monn A'mokk (New Earth) : 1
## 3rd Qu.:213203 A'morr (New Earth) : 1
## Max. :404010 A-Mortal (New Earth) : 1
## (Other) :6890
## urlslug ID
## \\/wiki\\/3g4_(New_Earth) : 1 :2013
## \\/wiki\\/500-ZQ_(New_Earth) : 1 Identity Unknown: 9
## \\/wiki\\/A-Mortal_(New_Earth) : 1 Public Identity :2466
## \\/wiki\\/A%27Hwiirdh-Paan%27A_(New_Earth): 1 Secret Identity :2408
## \\/wiki\\/A%27monn_A%27mokk_(New_Earth) : 1
## \\/wiki\\/A%27morr_(New_Earth) : 1
## (Other) :6890
## ALIGN EYE HAIR
## : 601 :3628 :2274
## Bad Characters :2895 Blue Eyes :1102 Black Hair:1574
## Good Characters :2832 Brown Eyes: 879 Brown Hair:1148
## Neutral Characters: 565 Black Eyes: 412 Blond Hair: 744
## Reformed Criminals: 3 Green Eyes: 291 Red Hair : 461
## Red Eyes : 208 White Hair: 346
## (Other) : 376 (Other) : 349
## SEX GSM
## : 125 :6832
## Female Characters :1967 Bisexual Characters : 10
## Genderless Characters : 20 Homosexual Characters: 54
## Male Characters :4783
## Transgender Characters: 1
##
##
## ALIVE APPEARANCES FIRST.APPEARANCE
## : 3 Min. : 1.00 2010, December: 78
## Deceased Characters:1693 1st Qu.: 2.00 : 69
## Living Characters :5200 Median : 6.00 2006, June : 48
## Mean : 23.63 1989, January : 45
## 3rd Qu.: 15.00 2009, October : 44
## Max. :3093.00 1988, March : 40
## NA's :355 (Other) :6572
## YEAR
## Min. :1935
## 1st Qu.:1983
## Median :1992
## Mean :1990
## 3rd Qu.:2003
## Max. :2013
## NA's :69
## 'data.frame': 16376 obs. of 13 variables:
## $ page_id : int 1678 7139 64786 1868 2460 2458 2166 1833 29481 1837 ...
## $ name : Factor w/ 16376 levels "'Spinner (Earth-616)",..: 13956 2331 16000 6775 14711 1579 12352 6556 13214 7687 ...
## $ urlslug : Factor w/ 16376 levels "\\/%22Spider-Girl%22_(Mutant\\/Spider_Clone)_(Earth-616)",..: 13954 2331 16000 6775 14709 1579 12351 6556 13213 7687 ...
## $ ID : Factor w/ 5 levels "","Known to Authorities Identity",..: 5 4 4 4 3 4 4 4 4 4 ...
## $ ALIGN : Factor w/ 4 levels "","Bad Characters",..: 3 3 4 3 3 3 3 3 4 3 ...
## $ EYE : Factor w/ 25 levels "","Amber Eyes",..: 11 5 5 5 5 5 6 6 6 5 ...
## $ HAIR : Factor w/ 26 levels "","Auburn Hair",..: 8 25 4 4 5 15 8 8 8 5 ...
## $ SEX : Factor w/ 5 levels "","Agender Characters",..: 5 5 5 5 5 5 5 5 5 5 ...
## $ GSM : Factor w/ 7 levels "","Bisexual Characters",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ ALIVE : Factor w/ 3 levels "","Deceased Characters",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ APPEARANCES : int 4043 3360 3061 2961 2258 2255 2072 2017 1955 1934 ...
## $ FIRST.APPEARANCE: Factor w/ 833 levels "","Apr-00","Apr-01",..: 101 505 740 523 651 659 659 591 797 659 ...
## $ Year : int 1962 1941 1974 1963 1950 1961 1961 1962 1963 1961 ...
## page_id name
## Min. : 1025 'Spinner (Earth-616) : 1
## 1st Qu.: 28310 \\"Spider-Girl\\" (Mutant\\/Spider Clone) (Earth-616): 1
## Median :282578 \\"Thumper\\" Morgan (Earth-616) : 1
## Mean :300232 \\u00c4kr\\u00e4s (Earth-616) : 1
## 3rd Qu.:509077 107 (Earth-616) : 1
## Max. :755278 11-Ball (Earth-616) : 1
## (Other) :16370
## urlslug
## \\/%22Spider-Girl%22_(Mutant\\/Spider_Clone)_(Earth-616): 1
## \\/%22Thumper%22_Morgan_(Earth-616) : 1
## \\/%27Spinner_(Earth-616) : 1
## \\/%C3%84kr%C3%A4s_(Earth-616) : 1
## \\/107_(Earth-616) : 1
## \\/11-Ball_(Earth-616) : 1
## (Other) :16370
## ID ALIGN
## :3770 :2812
## Known to Authorities Identity: 15 Bad Characters :6720
## No Dual Identity :1788 Good Characters :4636
## Public Identity :4528 Neutral Characters:2208
## Secret Identity :6275
##
##
## EYE HAIR SEX
## :9767 :4264 : 854
## Blue Eyes :1962 Black Hair:3755 Agender Characters : 45
## Brown Eyes:1924 Brown Hair:2339 Female Characters : 3837
## Green Eyes: 613 Blond Hair:1582 Genderfluid Characters: 2
## Black Eyes: 555 No Hair :1176 Male Characters :11638
## Red Eyes : 508 Bald : 838
## (Other) :1047 (Other) :2422
## GSM ALIVE APPEARANCES
## :16286 : 3 Min. : 1.00
## Bisexual Characters : 19 Deceased Characters: 3765 1st Qu.: 1.00
## Genderfluid Characters: 1 Living Characters :12608 Median : 3.00
## Homosexual Characters : 66 Mean : 17.03
## Pansexual Characters : 1 3rd Qu.: 8.00
## Transgender Characters: 2 Max. :4043.00
## Transvestites : 1 NA's :1096
## FIRST.APPEARANCE Year
## : 815 Min. :1939
## Jun-92 : 72 1st Qu.:1974
## May-93 : 69 Median :1990
## Sep-06 : 67 Mean :1985
## Jan-94 : 66 3rd Qu.:2000
## Oct-93 : 58 Max. :2013
## (Other):15229 NA's :815
Se realizará una revisión de los elementos faltantes en cada conjunto de datos, así como el tratamiento básico de estos datos: normalización de clasificación, transformación de fechas.
#Definicion de Tipos correctos de variables
dc$name <- as.character(dc$name)
dc$urlslug <- as.character(dc$urlslug)
dc$FIRST.APPEARANCE <- as.character(dc$FIRST.APPEARANCE)
marvel$name <- as.character(marvel$name)
marvel$urlslug <- as.character(marvel$urlslug)
marvel$FIRST.APPEARANCE <- as.character(marvel$FIRST.APPEARANCE)Se realizará un análisis previo para determinar los datos faltantes de cada dataset, luego esta información será tomada como base, para el tratamiento respectivo de los datos.
Este código ha sido oculto, pero puede mostrarse a través del botón:
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 2013
## [1] 0
## [1] 601
## [1] 0
## [1] 3628
## [1] 0
## [1] 2274
## [1] 0
## [1] 125
## [1] 0
## [1] 6832
## [1] 0
## [1] 3
## [1] 355
## [1] 0
## [1] 0
## [1] 69
## [1] 69
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 0
## [1] 3770
## [1] 0
## [1] 2812
## [1] 0
## [1] 9767
## [1] 0
## [1] 4264
## [1] 0
## [1] 854
## [1] 0
## [1] 16286
## [1] 0
## [1] 3
## [1] 1096
## [1] 0
## [1] 0
## [1] 815
## [1] 815
## [1] 0
Se realizará un análisis previo para determinar los datos faltantes de cada conjunto de datos, luego esta información será tomada como base, para el tratamiento respectivo de los datos.
Para el ID crearemos una nueva categoría “NOT SPECIFIED”, en ambos conjuntos de datos.
#PARA ID FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
dc$ID <- as.character(dc$ID) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
dc$ID[dc$ID==''] <- 'NOT SPECIFIED'
dc$ID <- factor (dc$ID) #RECONVERSION A FACTOR
#PARA ID FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
marvel$ID <- as.character(marvel$ID) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
marvel$ID[marvel$ID==''] <- 'NOT SPECIFIED'
marvel$ID <- factor (marvel$ID) #RECONVERSION A FACTORPara el ALIGN crearemos una nueva categoría “NOT SPECIFIED”, en ambos conjuntos de datos
#PARA ALIGN FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
dc$ALIGN <- as.character(dc$ALIGN) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
dc$ALIGN[dc$ALIGN==''] <- 'NOT SPECIFIED'
dc$ALIGN <- factor (dc$ALIGN) #RECONVERSION A FACTOR
#PARA ALIGN FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
marvel$ALIGN <- as.character(marvel$ALIGN) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
marvel$ALIGN[marvel$ALIGN==''] <- 'NOT SPECIFIED'
marvel$ALIGN <- factor (marvel$ALIGN) #RECONVERSION A FACTORPara el EYE crearemos una nueva categoría “NOT SPECIFIED”, en ambos conjuntos de datos
#PARA EYE FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
dc$EYE <- as.character(dc$EYE) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
dc$EYE[dc$EYE==''] <- 'NOT SPECIFIED'
dc$EYE <- factor (dc$EYE) #RECONVERSION A FACTOR
#PARA EYE FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
marvel$EYE <- as.character(marvel$EYE) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
marvel$EYE[marvel$EYE==''] <- 'NOT SPECIFIED'
marvel$EYE <- factor (marvel$EYE) #RECONVERSION A FACTORPara el HAIR crearemos una nueva categoría “NOT SPECIFIED”, en ambos conjuntos de datos
#PARA EYE FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
dc$HAIR <- as.character(dc$HAIR) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
dc$HAIR[dc$HAIR==''] <- 'NOT SPECIFIED'
dc$HAIR <- factor (dc$HAIR) #RECONVERSION A FACTOR
#PARA EYE FALTANTES: CREAMOS CATEGORIA "NOT SPECIFIED"
marvel$HAIR <- as.character(marvel$HAIR) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
marvel$HAIR[marvel$HAIR==''] <- 'NOT SPECIFIED'
marvel$HAIR <- factor (marvel$HAIR) #RECONVERSION A FACTORPara el SEX, reemplazaremos por la moda.
## [1] "Male Characters"
dc$SEX[dc$SEX==''] <- 'Male Characters'
#PARA SEX FALTANTES: POR LO QUE SE OPTA POR REEMPLAZAR EL VALOR POR LA MODA.
mi_moda(marvel$SEX)## [1] "Male Characters"
Para el GENDER, se detecta la mezcla de SEX y GENDER indistintamente, por lo que se procede a depurar los GENEROS en la categoría respectiva GSM, y se asigna manualmente el sexo que corresponde, luego de una búsqueda en internet de los personajes.
Adicionalmente, ante la ausencia del género HETEROSEXUAL, se crea la categoría, y es asignada a todos aquellos personajes que no tienen géneros alternativos.
#DETECTAMOS "TRANSGENDER" Y "GENDERLESS" COMO SEXO
#PROCEDEMOS CON LA DEPURACION DE TRANSGENDER Y GENDERLESS COMO SEXO, Y ASIGNACION DEL GENERO A LA VARIABLE CORRECTA "GSM".
which(dc$SEX=='Transgender Characters')## [1] 3878
## [1] 797 906 907 921 1123 1295 1871 2146 2255 2678 2801 3608 3729 4092 5014
## [16] 5080 5336 5844 5857 6854
dc[3878, 'SEX'] <- 'Female Characters'
dc[797, 'SEX'] <- 'Male Characters'
dc[906, 'SEX'] <- 'Male Characters'
dc[907, 'SEX'] <- 'Male Characters'
dc[921, 'SEX'] <- 'Male Characters'
dc[1123, 'SEX'] <- 'Male Characters'
dc[1295, 'SEX'] <- 'Male Characters'
dc[1871, 'SEX'] <- 'Male Characters'
dc[2146, 'SEX'] <- 'Male Characters'
dc[2255, 'SEX'] <- 'Male Characters'
dc[2678, 'SEX'] <- 'Male Characters'
dc[2801, 'SEX'] <- 'Male Characters'
dc[3608, 'SEX'] <- 'Male Characters'
dc[3729, 'SEX'] <- 'Male Characters'
dc[4092, 'SEX'] <- 'Male Characters'
dc[5014, 'SEX'] <- 'Male Characters'
dc[5080, 'SEX'] <- 'Male Characters'
dc[5336, 'SEX'] <- 'Male Characters'
dc[5844, 'SEX'] <- 'Male Characters'
dc[5857, 'SEX'] <- 'Male Characters'
dc[6854, 'SEX'] <- 'Male Characters'
dc$GSM <- as.character (dc$GSM)
dc[797, 'GSM'] <- 'Agender Characters'
dc[906, 'GSM'] <- 'Agender Characters'
dc[907, 'GSM'] <- 'Agender Characters'
dc[921, 'GSM'] <- 'Agender Characters'
dc[1123, 'GSM'] <- 'Agender Characters'
dc[1295, 'GSM'] <- 'Agender Characters'
dc[1871, 'GSM'] <- 'Agender Characters'
dc[2146, 'GSM'] <- 'Agender Characters'
dc[2255, 'GSM'] <- 'Agender Characters'
dc[2678, 'GSM'] <- 'Agender Characters'
dc[2801, 'GSM'] <- 'Agender Characters'
dc[3608, 'GSM'] <- 'Agender Characters'
dc[3729, 'GSM'] <- 'Agender Characters'
dc[4092, 'GSM'] <- 'Agender Characters'
dc[5014, 'GSM'] <- 'Agender Characters'
dc[5080, 'GSM'] <- 'Agender Characters'
dc[5336, 'GSM'] <- 'Agender Characters'
dc[5844, 'GSM'] <-'Agender Characters'
dc[5857, 'GSM'] <- 'Agender Characters'
dc[6854, 'GSM'] <- 'Agender Characters'
dc[3878, 'GSM'] <- 'Agender Characters'
dc[1295, 'GSM'] <- 'Genderfluid Characters'
dc$SEX <- factor (dc$SEX) #RECONVERSION A FACTOR
dc$GSM <- factor (dc$GSM) #RECONVERSION A FACTOR
#PARA GSM FALTANTES: AQUELLOS PERSONAJES QUE NO TIENEN DEFINIDOS GENEROS ALTERNATIVOS SON CLASIFICADOS COMO "HETEROSEXUAL"
dc$GSM <- as.character(dc$GSM) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
dc$GSM[dc$GSM==''] <- 'Heterosexual Characters'
dc$GSM <- factor (dc$GSM) #RECONVERSION A FACTOR
#DETECTAMOS "AGENDER" Y "GENDERFLUID" COMO SEXO
#PROCEDEMOS CON LA DEPURACION DE TRANSGENDER Y GENDERLESS COMO SEXO, Y ASIGNACION DEL GENERO A LA VARIABLE CORRECTA "GSM".
length(which(marvel$SEX=='Agender Characters'))## [1] 45
## [1] 2
marvel$GSM <- as.character (marvel$GSM)
marvel$GSM[marvel$SEX=='Agender Characters'] <- 'Agender Characters'
marvel$GSM[marvel$SEX=='Genderfluid Characters'] <- 'Genderfluid Characters'
marvel$SEX[marvel$SEX=='Agender Characters'] <- 'Male Characters'
marvel$SEX[marvel$SEX=='Genderfluid Characters'] <- 'Male Characters'
marvel$SEX <- factor (marvel$SEX) #RECONVERSION A FACTOR
marvel$GSM <- factor (marvel$GSM) #RECONVERSION A FACTOR
#PARA GSM FALTANTES: AQUELLOS PERSONAJES QUE NO TIENEN DEFINIDOS GENEROS ALTERNATIVOS SON CLASIFICADOS COMO "HETEROSEXUAL"
marvel$GSM <- as.character(marvel$GSM) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
marvel$GSM[marvel$GSM==''] <- 'Heterosexual Characters'
marvel$GSM <- factor (marvel$GSM) #RECONVERSION A FACTORPara el ALIVE, en DC, el estado es asignado manualmente luego de una búsqueda en internet. Mientras que en Marvel se reemplaza por ´Living Characters´ que es el factor predominante.
#PARA ALIVE FALTANTES: LOS ASIGNAREMOS SEGUN CORRESPONDA CON INFORMACION DE INTERNET
which(dc$ALIVE=='')## [1] 2727 3251 6855
dc$ALIVE <- as.character(dc$ALIVE) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
dc[2727, 'ALIVE'] <- 'Living Characters'
dc[3251, 'ALIVE'] <- 'Living Characters'
dc[6855, 'ALIVE'] <- 'Living Characters'
dc$ALIVE <- factor (dc$ALIVE) #RECONVERSION A FACTOR
#PARA ALIVE FALTANTES: LOS ASIGNAREMOS SEGUN CORRESPONDA CON INFORMACION DE INTERNET
which(marvel$ALIVE=='')## [1] 16294 16330 16348
marvel$ALIVE <- as.character(marvel$ALIVE) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
marvel$ALIVE[marvel$ALIVE=='']<-'Living Characters'
marvel$ALIVE <- factor (marvel$ALIVE) #RECONVERSION A FACTORPara EYE, se detecta una mezcla en los datos EYE y HAIR, que es depurada manualmente.
## [1] "Amber Eyes" "Auburn Hair" "Black Eyes"
## [4] "Blue Eyes" "Brown Eyes" "Gold Eyes"
## [7] "Green Eyes" "Grey Eyes" "Hazel Eyes"
## [10] "NOT SPECIFIED" "Orange Eyes" "Photocellular Eyes"
## [13] "Pink Eyes" "Purple Eyes" "Red Eyes"
## [16] "Violet Eyes" "White Eyes" "Yellow Eyes"
## [1] 873 1777 3601 3624 3628 4071 5347
dc$HAIR<-as.character(dc$HAIR)
dc$EYE<-as.character(dc$EYE)
dc$HAIR[dc$EYE=='Auburn Hair'] <- 'Auburn Hair'
dc$EYE[dc$EYE=='Auburn Hair'] <- 'NOT SPECIFIED'
dc$HAIR<-factor(dc$HAIR)
dc$EYE<-factor(dc$EYE)Para FIRST.APPEARANCE, el año de primera aparición del personaje, procedemos a eliminar las observaciones que no cuenten con este dato. ya que gran parte del análisis exploratorio a realizar requiere este dato, para contrastar la evolución en el tiempo.
#PARA FIRST.APPEARANCE FALTANTES: ELIMINACION DE OBSERVACIONES
dc<-subset(dc, !is.na(dc$FIRST.APPEARANCE) | dc$FIRST.APPEARANCE=='')
#PARA YEAR: ELIMINACION DE OBSERVACIONES
dc<-subset(dc, !is.na(dc$YEAR))
#PARA FIRST.APPEARANCE FALTANTES: ELIMINACION DE OBSERVACIONES
marvel<-subset(marvel, !is.na(marvel$FIRST.APPEARANCE) | marvel$FIRST.APPEARANCE=='')
#PARA YEAR: ELIMINACION DE OBSERVACIONES
marvel<-subset(marvel, !is.na(marvel$Year))Para la variable APPEARANCES, es necesaria la creación de un modelo de regresión lineal que calcule las apariciones de los datos faltantes. esta será creada luego de la fase de ETL, en que se normalicen los datos que serán insumos para ese modelo.
En esta sección realizaremos crearemos variables nuevas relacionadas con los datos iniciales del conjunto de datos, que brindarán una mejor perspectiva para la visualización y clasificación de los datos.
Como primer paso tenemos la creación de variables: NAME LENGTH, URL LENGTH, luego homogenizaremos la fecha, para calcular dos variables relacionadas: DECADA y TRIMESTRE de aparición.
finalmente crearemos el modelo de regresión lineal, para el cálculo de las apariciones faltantes en algunas observaciones.
#################################################################
################INICIO CREACION DE VARIABLES#####################
#################################################################
#AGREGA COLuMNA NAME LENGTH
dc$NAME.LENGTH<-nchar(dc$name, type = "chars", allowNA = FALSE, keepNA = NA)
marvel$NAME.LENGTH<-nchar(marvel$name, type = "chars", allowNA = FALSE, keepNA = NA)
#AGREGA COLuMNA URLLENGTH LENGTH
dc$URL.LENGTH<-nchar(dc$urlslug, type = "chars", allowNA = FALSE, keepNA = NA)
marvel$URL.LENGTH<-nchar(marvel$urlslug, type = "chars", allowNA = FALSE, keepNA = NA)El tratamiento de la fecha es distinto en cada conjunto de datos, ya que no comparten el mismo formato.
#AGREGA COLUMNA CON EL PARSEO DE FECHA DE APARICION DE STRING A DATE
dc$FECHA.APARICION<-parse_date_time(dc$FIRST.APPEARANCE, orders = c("Yb"))
dc$FECHA.APARICION <- as.Date(dc$FECHA.APARICION)
marvel$FECHA.APARICION<-parse_date_time2(marvel$FIRST.APPEARANCE,"by", cutoff_2000 = 20)
marvel$FECHA.APARICION <- as.Date(marvel$FECHA.APARICION)
#CORRECCION DE ERRORES DEL PARSEO DE FECHA
which(is.na(dc$FECHA.APARICION))## [1] 210 261 338 364 557 583 617 642 714 811 843 889 1114 1200 1286
## [16] 1351 1354 1567 1673 1761 1764 1765 1770 2008 2135 2167 2280 2298 2310 2312
## [31] 2341 2357 2358 2476 2495 2513 2543 2680 2702 2706 2715 2719 2728 2737 2757
## [46] 2976 3032 3315 3334 3347 3558 3596 3600 3602 3634 3639 3699 3706 3715 3723
## [61] 3739 4053 4077 4079 4082 4096 4147 4151 4174 4190 4211 4232 4476 4496 4535
## [76] 4554 4585 4587 4652 4669 4670 4682 4686 4688 4697 5081 5086 5088 5098 5111
## [91] 5192 5197 5239 5262 5264 5266 5267 5285 5287 5310 5317 5320 5321 5333 5337
## [106] 5346 5911 5925 5932 5968 5972 5975 5991 6035 6045 6051 6088 6096 6098 6099
## [121] 6101 6107 6108 6109 6125 6140 6146 6151 6171 6203 6215 6229 6244 6257 6261
## [136] 6313 6325 6359 6609 6622 6623 6651 6681 6689 6708 6749
## integer(0)
#SE REVISA QUE CONTIENEN FECHAS INCOMPLETAS, SE PROCEDE A ELIMINAR LOS REGISTROS CON FECHAS ERRONEAS.
dc<-subset(dc, !is.na(dc$FECHA.APARICION))
#ELIMINACION DE COLUMNA DE FECHA ORIGINAL SIN PARSEAR
dc[ ,c('FIRST.APPEARANCE')] <- list(NULL)
marvel[ ,c('FIRST.APPEARANCE')] <- list(NULL)Se crean las variables relacionadas a la fecha de aparición del personaje.
#AGREGA COLUMNA CON LOS AñOS DESDE LA APARICION DEL PERSONAJE
dc$ANIOS.DESDE.APARICION<-floor(age_calc(dc$FECHA.APARICION, enddate = Sys.Date(), units = "years", precise = TRUE))
marvel$ANIOS.DESDE.APARICION<-floor(age_calc(marvel$FECHA.APARICION, enddate = Sys.Date(), units = "years", precise = TRUE))
#AGREGA COLUMNA CON EL PARSEO MES DE APARICION
dc$MES.APARICION <- ymd(dc$FECHA.APARICION) %>%
lubridate::month(label = TRUE, abbr = FALSE)
marvel$MES.APARICION <- ymd(marvel$FECHA.APARICION) %>%
lubridate::month(label = TRUE, abbr = FALSE)
#AGREGA COLUMNA CON EL PARSEO TRIMESTRE DE APARICION
dc$TRIMESTRE.APARICION<- ymd(dc$FECHA.APARICION) %>%
lubridate::quarter() # Grab quarter.
marvel$TRIMESTRE.APARICION<- ymd(marvel$FECHA.APARICION) %>%
lubridate::quarter() # Grab quarter.
#AGREGA COLUMNA CON LA DECADA DE APARICION
dc$DECADA.APARICION <- floor_decade(dc$YEAR)
marvel$DECADA.APARICION <- floor_decade(marvel$Year)El modelo de regresión lineal usa varias variables, relacionadas principalmente al PAGE_ID Y EL URL.LENTGH, ya que de forma empírica hemos podido observar que los personajes más antiguos que suelen tener mayor número de apariciones tienen un ID y URL menor que aquellos personajes modernos con menor número de apariciones.
#################################################################
######INICIO MODELO DE REGRESION PARA APARICIONES FALTANTES######
#################################################################
#PARA APPEARANCES FALTANTES: LOS ASIGNAREMOS CON UN MODELO DE REGRESION LINEAL
modelo_dc <- lm(dc$APPEARANCES~dc$page_id + dc$NAME.LENGTH + + dc$URL.LENGTH + dc$ID + dc$ALIGN + dc$EYE + dc$HAIR+ dc$SEX+ dc$GSM+ dc$ALIVE+ dc$YEAR+ dc$FECHA.APARICION,
data=dc,na.action=na.exclude)
modelo_marvel <- lm(marvel$APPEARANCES~marvel$page_id + marvel$NAME.LENGTH + + marvel$URL.LENGTH + marvel$ID + marvel$ALIGN + marvel$EYE + marvel$HAIR+ marvel$SEX+ marvel$GSM+ marvel$ALIVE+ marvel$Year+ marvel$FECHA.APARICION,
data=marvel,na.action=na.exclude)
summary(modelo_dc)##
## Call:
## lm(formula = dc$APPEARANCES ~ dc$page_id + dc$NAME.LENGTH + +dc$URL.LENGTH +
## dc$ID + dc$ALIGN + dc$EYE + dc$HAIR + dc$SEX + dc$GSM + dc$ALIVE +
## dc$YEAR + dc$FECHA.APARICION, data = dc, na.action = na.exclude)
##
## Residuals:
## Min 1Q Median 3Q Max
## -119.84 -24.41 -4.64 10.97 2954.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.411e+02 7.182e+03 -0.061 0.95103
## dc$page_id -1.218e-04 1.067e-05 -11.415 < 2e-16 ***
## dc$NAME.LENGTH 7.883e+00 4.290e+01 0.184 0.85423
## dc$URL.LENGTH -8.138e+00 4.290e+01 -0.190 0.84957
## dc$IDNOT SPECIFIED -1.229e+01 2.770e+01 -0.444 0.65723
## dc$IDPublic Identity -1.585e+00 2.769e+01 -0.057 0.95435
## dc$IDSecret Identity 3.990e+00 2.768e+01 0.144 0.88541
## dc$ALIGNGood Characters 2.063e+01 2.403e+00 8.584 < 2e-16 ***
## dc$ALIGNNeutral Characters 6.444e+00 4.011e+00 1.607 0.10817
## dc$ALIGNNOT SPECIFIED 1.148e+01 3.946e+00 2.910 0.00363 **
## dc$ALIGNReformed Criminals 2.022e+01 4.779e+01 0.423 0.67224
## dc$EYEBlack Eyes -3.551e+01 3.725e+01 -0.953 0.34047
## dc$EYEBlue Eyes -2.301e+00 3.711e+01 -0.062 0.95056
## dc$EYEBrown Eyes -2.486e+01 3.710e+01 -0.670 0.50287
## dc$EYEGold Eyes -3.099e+01 4.819e+01 -0.643 0.52020
## dc$EYEGreen Eyes -8.583e+00 3.737e+01 -0.230 0.81836
## dc$EYEGrey Eyes -2.433e+01 3.950e+01 -0.616 0.53798
## dc$EYEHazel Eyes -1.666e+01 4.083e+01 -0.408 0.68333
## dc$EYENOT SPECIFIED -3.536e+01 3.707e+01 -0.954 0.34010
## dc$EYEOrange Eyes -3.202e+01 4.851e+01 -0.660 0.50923
## dc$EYEPhotocellular Eyes -2.657e+01 3.926e+01 -0.677 0.49848
## dc$EYEPink Eyes -2.620e+01 5.236e+01 -0.500 0.61683
## dc$EYEPurple Eyes 2.325e+01 4.319e+01 0.538 0.59041
## dc$EYERed Eyes -2.272e+01 3.754e+01 -0.605 0.54514
## dc$EYEViolet Eyes -4.151e+01 4.747e+01 -0.875 0.38186
## dc$EYEWhite Eyes -2.813e+01 3.785e+01 -0.743 0.45739
## dc$EYEYellow Eyes -2.216e+01 3.828e+01 -0.579 0.56270
## dc$HAIRBlack Hair 6.249e+00 3.387e+01 0.185 0.85360
## dc$HAIRBlond Hair -1.041e+00 3.394e+01 -0.031 0.97554
## dc$HAIRBlue Hair -4.671e+00 3.650e+01 -0.128 0.89819
## dc$HAIRBrown Hair -5.052e-01 3.389e+01 -0.015 0.98811
## dc$HAIRGold Hair -2.576e+01 5.349e+01 -0.482 0.63017
## dc$HAIRGreen Hair 1.946e+01 3.627e+01 0.536 0.59164
## dc$HAIRGrey Hair -7.117e+00 3.449e+01 -0.206 0.83652
## dc$HAIRNOT SPECIFIED 1.977e+00 3.384e+01 0.058 0.95342
## dc$HAIROrange Hair -1.211e+01 3.840e+01 -0.315 0.75243
## dc$HAIRPink Hair -6.579e+00 4.271e+01 -0.154 0.87759
## dc$HAIRPlatinum Blond Hair -4.684e+01 6.755e+01 -0.693 0.48805
## dc$HAIRPurple Hair -9.148e+00 3.708e+01 -0.247 0.80512
## dc$HAIRRed Hair -4.140e+00 3.402e+01 -0.122 0.90314
## dc$HAIRReddish Brown Hair -1.078e+01 6.752e+01 -0.160 0.87319
## dc$HAIRSilver Hair 8.707e+00 5.851e+01 0.149 0.88170
## dc$HAIRStrawberry Blond Hair 2.814e+00 3.736e+01 0.075 0.93996
## dc$HAIRViolet Hair -1.111e+01 5.787e+01 -0.192 0.84773
## dc$HAIRWhite Hair -1.041e+00 3.412e+01 -0.030 0.97567
## dc$SEXMale Characters 1.983e+00 2.476e+00 0.801 0.42322
## dc$GSMBisexual Characters 2.401e+01 3.425e+01 0.701 0.48341
## dc$GSMGenderfluid Characters -3.488e+01 8.569e+01 -0.407 0.68402
## dc$GSMHeterosexual Characters -1.576e+00 2.021e+01 -0.078 0.93783
## dc$GSMHomosexual Characters 5.091e+00 2.333e+01 0.218 0.82729
## dc$ALIVELiving Characters 6.653e+00 2.431e+00 2.737 0.00622 **
## dc$YEAR 2.974e-01 3.641e+00 0.082 0.93491
## dc$FECHA.APARICION -3.369e-03 9.963e-03 -0.338 0.73529
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 82.58 on 6290 degrees of freedom
## (338 observations deleted due to missingness)
## Multiple R-squared: 0.1391, Adjusted R-squared: 0.132
## F-statistic: 19.55 on 52 and 6290 DF, p-value: < 2.2e-16
##
## Call:
## lm(formula = marvel$APPEARANCES ~ marvel$page_id + marvel$NAME.LENGTH +
## +marvel$URL.LENGTH + marvel$ID + marvel$ALIGN + marvel$EYE +
## marvel$HAIR + marvel$SEX + marvel$GSM + marvel$ALIVE + marvel$Year +
## marvel$FECHA.APARICION, data = marvel, na.action = na.exclude)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1368.2 -20.5 -5.6 9.0 3877.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.112e+03 5.131e+03 0.996 0.319195
## marvel$page_id -5.015e-05 3.230e-06 -15.529 < 2e-16 ***
## marvel$NAME.LENGTH -4.470e+02 1.788e+01 -25.000 < 2e-16 ***
## marvel$URL.LENGTH 4.472e+02 1.787e+01 25.019 < 2e-16 ***
## marvel$IDNo Dual Identity -2.204e+01 2.370e+01 -0.930 0.352412
## marvel$IDNOT SPECIFIED -3.437e+01 2.364e+01 -1.454 0.145990
## marvel$IDPublic Identity -2.493e+01 2.362e+01 -1.055 0.291265
## marvel$IDSecret Identity -3.274e+01 2.360e+01 -1.387 0.165410
## marvel$ALIGNGood Characters 2.059e+01 1.952e+00 10.548 < 2e-16 ***
## marvel$ALIGNNeutral Characters 9.107e+00 2.433e+00 3.743 0.000182 ***
## marvel$ALIGNNOT SPECIFIED 2.063e+00 2.266e+00 0.910 0.362583
## marvel$EYEBlack Eyeballs 2.165e+02 6.541e+01 3.310 0.000936 ***
## marvel$EYEBlack Eyes -6.017e+01 3.739e+01 -1.609 0.107546
## marvel$EYEBlue Eyes -3.020e+01 3.722e+01 -0.811 0.417115
## marvel$EYEBrown Eyes -4.703e+01 3.722e+01 -1.264 0.206418
## marvel$EYECompound Eyes -7.507e+01 9.829e+01 -0.764 0.445008
## marvel$EYEGold Eyes 1.956e+01 4.551e+01 0.430 0.667326
## marvel$EYEGreen Eyes -3.853e+01 3.737e+01 -1.031 0.302590
## marvel$EYEGrey Eyes -2.659e+01 3.840e+01 -0.692 0.488635
## marvel$EYEHazel Eyes 4.815e+01 3.895e+01 1.236 0.216471
## marvel$EYEMagenta Eyes -4.667e+01 9.100e+01 -0.513 0.608053
## marvel$EYEMultiple Eyes -5.373e+01 5.511e+01 -0.975 0.329596
## marvel$EYENo Eyes -6.824e+01 5.066e+01 -1.347 0.178032
## marvel$EYENOT SPECIFIED -6.996e+01 3.718e+01 -1.882 0.059898 .
## marvel$EYEOne Eye -6.236e+01 4.242e+01 -1.470 0.141601
## marvel$EYEOrange Eyes -5.799e+01 4.162e+01 -1.393 0.163527
## marvel$EYEPink Eyes -6.648e+01 4.399e+01 -1.511 0.130723
## marvel$EYEPurple Eyes -5.348e+01 4.184e+01 -1.278 0.201173
## marvel$EYERed Eyes -5.502e+01 3.741e+01 -1.471 0.141406
## marvel$EYESilver Eyes -4.947e+01 4.704e+01 -1.052 0.293020
## marvel$EYEVariable Eyes -4.993e+01 4.207e+01 -1.187 0.235338
## marvel$EYEViolet Eyes -6.922e+01 4.707e+01 -1.471 0.141409
## marvel$EYEWhite Eyes -6.003e+01 3.750e+01 -1.601 0.109475
## marvel$EYEYellow Eyeballs -6.501e+01 5.259e+01 -1.236 0.216398
## marvel$EYEYellow Eyes -5.472e+01 3.766e+01 -1.453 0.146252
## marvel$HAIRBald -1.910e+01 1.131e+01 -1.689 0.091268 .
## marvel$HAIRBlack Hair -2.420e+01 1.089e+01 -2.223 0.026250 *
## marvel$HAIRBlond Hair -2.119e+01 1.100e+01 -1.926 0.054071 .
## marvel$HAIRBlue Hair 2.670e+01 1.670e+01 1.599 0.109809
## marvel$HAIRBronze Hair -5.503e+01 9.163e+01 -0.601 0.548180
## marvel$HAIRBrown Hair -2.019e+01 1.095e+01 -1.843 0.065407 .
## marvel$HAIRDyed Hair 9.670e+00 9.163e+01 0.106 0.915952
## marvel$HAIRGold Hair -5.433e+01 3.642e+01 -1.492 0.135760
## marvel$HAIRGreen Hair -2.304e+01 1.410e+01 -1.634 0.102275
## marvel$HAIRGrey Hair -2.870e+01 1.153e+01 -2.490 0.012801 *
## marvel$HAIRLight Brown Hair -4.423e+01 4.210e+01 -1.051 0.293411
## marvel$HAIRMagenta Hair -3.462e+01 5.361e+01 -0.646 0.518470
## marvel$HAIRNo Hair -1.835e+01 1.123e+01 -1.634 0.102366
## marvel$HAIRNOT SPECIFIED -1.993e+01 1.094e+01 -1.822 0.068490 .
## marvel$HAIROrange-brown Hair -1.736e+01 6.524e+01 -0.266 0.790213
## marvel$HAIROrange Hair -2.431e+01 1.778e+01 -1.367 0.171578
## marvel$HAIRPink Hair -4.174e+01 2.067e+01 -2.019 0.043467 *
## marvel$HAIRPurple Hair -7.048e+00 1.881e+01 -0.375 0.707840
## marvel$HAIRRed Hair -1.542e+01 1.139e+01 -1.353 0.176027
## marvel$HAIRReddish Blond Hair -9.326e-01 3.890e+01 -0.024 0.980874
## marvel$HAIRSilver Hair 1.409e+01 2.674e+01 0.527 0.598114
## marvel$HAIRStrawberry Blond Hair 1.392e+01 1.729e+01 0.805 0.420786
## marvel$HAIRVariable Hair -3.430e+01 2.729e+01 -1.257 0.208830
## marvel$HAIRWhite Hair -2.150e+01 1.133e+01 -1.898 0.057746 .
## marvel$HAIRYellow Hair -2.652e+01 2.401e+01 -1.105 0.269377
## marvel$SEXMale Characters 3.848e+00 1.917e+00 2.007 0.044778 *
## marvel$GSMBisexual Characters 1.633e+02 2.689e+01 6.074 1.28e-09 ***
## marvel$GSMGenderfluid Characters 2.063e+02 6.639e+01 3.107 0.001893 **
## marvel$GSMHeterosexual Characters -1.364e+01 1.617e+01 -0.843 0.399088
## marvel$GSMHomosexual Characters -3.381e+00 2.016e+01 -0.168 0.866831
## marvel$GSMPansexual Characters 3.191e+01 9.339e+01 0.342 0.732555
## marvel$GSMTransgender Characters 1.627e+01 6.635e+01 0.245 0.806236
## marvel$GSMTransvestites 4.447e+02 9.246e+01 4.810 1.52e-06 ***
## marvel$ALIVELiving Characters 9.422e+00 1.797e+00 5.243 1.60e-07 ***
## marvel$Year -2.978e+00 2.605e+00 -1.143 0.252967
## marvel$FECHA.APARICION 6.589e-03 7.133e-03 0.924 0.355632
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 90.94 on 14594 degrees of freedom
## (896 observations deleted due to missingness)
## Multiple R-squared: 0.1285, Adjusted R-squared: 0.1243
## F-statistic: 30.75 on 70 and 14594 DF, p-value: < 2.2e-16
Los modelos de regresión lineal creados tienen una precisión muy baja (R Cuadrado de 0.10 aprox.), por lo que más bien optaremos por reemplazar los valores de apariciones faltantes por la media. En el apartado de Machine Learning, trataremos de solventar este inconveniente creando un mejor modelo, de forma que pueda aprovechar mejor los datos y nos permita predecir las apariciones con una mayor fiabilidad.
#REEMPLAZA APPEARANCES VACIOS POR LA MEDIA
dc$APPEARANCES[is.na(dc$APPEARANCES)]<-ceiling(mean(dc$APPEARANCES,na.rm=TRUE))
marvel$APPEARANCES[is.na(marvel$APPEARANCES)]<-ceiling(mean(marvel$APPEARANCES,na.rm=TRUE))
#AGREGA COLUMNA CON LAS APARICIONES MEDIAS POR AÑO
dc$MEDIA.APARICIONES.ANIO<-(dc$APPEARANCES/dc$ANIOS.DESDE.APARICION)
marvel$MEDIA.APARICIONES.ANIO<-(marvel$APPEARANCES/marvel$ANIOS.DESDE.APARICION)
which(is.na(marvel))## integer(0)
## page_id name urlslug
## Min. : 1025 Length:15561 Length:15561
## 1st Qu.: 26841 Class :character Class :character
## Median :273384 Mode :character Mode :character
## Mean :289960
## 3rd Qu.:502038
## Max. :755278
##
## ID ALIGN
## Known to Authorities Identity: 15 Bad Characters :6450
## No Dual Identity :1598 Good Characters :4366
## NOT SPECIFIED :3602 Neutral Characters:2073
## Public Identity :4370 NOT SPECIFIED :2672
## Secret Identity :5976
##
##
## EYE HAIR SEX
## NOT SPECIFIED:9349 NOT SPECIFIED:4003 Female Characters: 3628
## Blue Eyes :1857 Black Hair :3585 Male Characters :11933
## Brown Eyes :1821 Brown Hair :2244
## Green Eyes : 580 Blond Hair :1498
## Black Eyes : 514 No Hair :1118
## Red Eyes : 480 Bald : 786
## (Other) : 960 (Other) :2327
## GSM ALIVE APPEARANCES
## Heterosexual Characters:15440 Deceased Characters: 3640 Min. : 1.0
## Homosexual Characters : 61 Living Characters :11921 1st Qu.: 1.0
## Agender Characters : 36 Median : 3.0
## Bisexual Characters : 18 Mean : 17.4
## Genderfluid Characters : 2 3rd Qu.: 11.0
## Transgender Characters : 2 Max. :4043.0
## (Other) : 2
## Year NAME.LENGTH URL.LENGTH FECHA.APARICION
## Min. :1939 Min. : 4.00 Min. : 6.0 Min. :1939-10-01
## 1st Qu.:1974 1st Qu.:20.00 1st Qu.:23.0 1st Qu.:1974-05-01
## Median :1990 Median :24.00 Median :26.0 Median :1990-01-01
## Mean :1985 Mean :24.35 Mean :26.4 Mean :1985-06-05
## 3rd Qu.:2000 3rd Qu.:27.00 3rd Qu.:29.0 3rd Qu.:2000-10-01
## Max. :2013 Max. :69.00 Max. :71.0 Max. :2013-06-01
##
## ANIOS.DESDE.APARICION MES.APARICION TRIMESTRE.APARICION DECADA.APARICION
## Min. : 6.00 octubre :1422 Min. :1.000 Min. :1930
## 1st Qu.:19.00 diciembre :1416 1st Qu.:2.000 1st Qu.:1970
## Median :30.00 agosto :1412 Median :3.000 Median :1990
## Mean :34.29 noviembre :1393 Mean :2.565 Mean :1981
## 3rd Qu.:45.00 septiembre:1392 3rd Qu.:4.000 3rd Qu.:2000
## Max. :80.00 junio :1307 Max. :4.000 Max. :2010
## (Other) :7219
## MEDIA.APARICIONES.ANIO
## Min. : 0.01250
## 1st Qu.: 0.04762
## Median : 0.13514
## Mean : 0.53517
## 3rd Qu.: 0.41667
## Max. :70.92982
##
## integer(0)
## page_id name urlslug ID
## Min. : 1380 Length:6681 Length:6681 Identity Unknown: 9
## 1st Qu.: 42999 Class :character Class :character NOT SPECIFIED :1934
## Median :140700 Mode :character Mode :character Public Identity :2386
## Mean :146977 Secret Identity :2352
## 3rd Qu.:212868
## Max. :404010
##
## ALIGN EYE HAIR
## Bad Characters :2830 NOT SPECIFIED:3507 NOT SPECIFIED:2191
## Good Characters :2714 Blue Eyes :1070 Black Hair :1510
## Neutral Characters: 548 Brown Eyes : 856 Brown Hair :1123
## NOT SPECIFIED : 586 Black Eyes : 401 Blond Hair : 719
## Reformed Criminals: 3 Green Eyes : 282 Red Hair : 457
## Red Eyes : 204 White Hair : 332
## (Other) : 361 (Other) : 349
## SEX GSM
## Female Characters:1911 Agender Characters : 19
## Male Characters :4770 Bisexual Characters : 9
## Genderfluid Characters : 1
## Heterosexual Characters:6601
## Homosexual Characters : 51
##
##
## ALIVE APPEARANCES YEAR NAME.LENGTH
## Deceased Characters:1643 Min. : 1.00 Min. :1935 Min. :10.00
## Living Characters :5038 1st Qu.: 3.00 1st Qu.:1983 1st Qu.:20.00
## Median : 7.00 Median :1993 Median :23.00
## Mean : 24.13 Mean :1990 Mean :23.15
## 3rd Qu.: 19.00 3rd Qu.:2003 3rd Qu.:26.00
## Max. :3093.00 Max. :2013 Max. :46.00
##
## URL.LENGTH FECHA.APARICION ANIOS.DESDE.APARICION MES.APARICION
## Min. :18.00 Min. :1935-10-01 Min. : 6.0 agosto : 634
## 1st Qu.:28.00 1st Qu.:1983-09-01 1st Qu.:16.0 diciembre : 632
## Median :32.00 Median :1993-01-01 Median :27.0 junio : 613
## Mean :31.19 Mean :1990-03-18 Mean :29.5 octubre : 604
## 3rd Qu.:34.00 3rd Qu.:2003-07-01 3rd Qu.:36.0 septiembre: 563
## Max. :54.00 Max. :2013-10-01 Max. :84.0 julio : 554
## (Other) :3081
## TRIMESTRE.APARICION DECADA.APARICION MEDIA.APARICIONES.ANIO
## Min. :1.000 Min. :1930 Min. : 0.0119
## 1st Qu.:2.000 1st Qu.:1980 1st Qu.: 0.1111
## Median :3.000 Median :1990 Median : 0.2973
## Mean :2.525 Mean :1985 Mean : 0.7336
## 3rd Qu.:4.000 3rd Qu.:2000 3rd Qu.: 0.7000
## Max. :4.000 Max. :2010 Max. :75.6364
##
En esta sección realizaremos un análisis de la correlación dentro de cada conjunto de datos, para identificar las tendencias dentro de cada uno de estos.
#################################################################
#############INICIO CORRELACION DE VARIABLES#####################
#################################################################
dccorrelation<-dc[,-13:-20]
dccorrelation$name<-NULL
dccorrelation$urlslug<-NULL
dccorrelation$ID<-as.numeric(dccorrelation$ID)
dccorrelation$ALIGN<-as.numeric(dccorrelation$ALIGN)
dccorrelation$HAIR<-as.numeric(dccorrelation$HAIR)
dccorrelation$EYE<-as.numeric(dccorrelation$EYE)
dccorrelation$SEX<-as.numeric(dccorrelation$SEX)
dccorrelation$GSM<-as.numeric(dccorrelation$GSM)
dccorrelation$ALIVE<-as.numeric(dccorrelation$ALIVE)
cor(dccorrelation)## page_id ID ALIGN EYE HAIR
## page_id 1.0000000000 -0.16299673 -0.05693924 0.16044400 0.002823465
## ID -0.1629967309 1.00000000 -0.11020121 -0.13825540 -0.045226812
## ALIGN -0.0569392359 -0.11020121 1.00000000 -0.06523654 -0.036431910
## EYE 0.1604440036 -0.13825540 -0.06523654 1.00000000 0.185095927
## HAIR 0.0028234654 -0.04522681 -0.03643191 0.18509593 1.000000000
## SEX -0.0691144169 0.02288311 -0.12768748 0.08325072 0.048286772
## GSM -0.0005881441 0.01374246 0.02072280 -0.02573470 -0.024145144
## ALIVE 0.0301699731 -0.03667491 0.07014972 0.02059655 -0.021861276
## APPEARANCES -0.2343211964 0.11097933 0.06578670 -0.13587387 -0.033036434
## YEAR 0.2587619960 0.00963177 -0.04879941 0.10727793 -0.014516761
## SEX GSM ALIVE APPEARANCES YEAR
## page_id -0.069114417 -0.0005881441 0.03016997 -0.234321196 0.258761996
## ID 0.022883106 0.0137424562 -0.03667491 0.110979332 0.009631770
## ALIGN -0.127687484 0.0207227969 0.07014972 0.065786697 -0.048799406
## EYE 0.083250723 -0.0257347018 0.02059655 -0.135873872 0.107277933
## HAIR 0.048286772 -0.0241451441 -0.02186128 -0.033036434 -0.014516761
## SEX 1.000000000 -0.0288566601 -0.06611165 0.008560995 -0.108399707
## GSM -0.028856660 1.0000000000 0.01562936 0.003945860 0.004461605
## ALIVE -0.066111647 0.0156293633 1.00000000 0.018066318 0.047398577
## APPEARANCES 0.008560995 0.0039458605 0.01806632 1.000000000 -0.246102722
## YEAR -0.108399707 0.0044616048 0.04739858 -0.246102722 1.000000000
#################################################################
################FIN CORRELACION DE VARIABLES#####################
#################################################################En el diagrama escogido para representar la correlación, los PIE CHARTS representan la “fuerza” de correlación de una variable con el resto. de lo cual se deduce:
PAGE_ID: guarda cierta correlación inversa con ID (tipo de identidad del personaje) y con APPEARANCES (cantidad de apariciones). Mientras que es positiva con EYE (color de ojos), y YEAR (año de primera aparición) del personaje. Esto puede deberse a como están agrupados los personajes en el sitio web de la WIKIA.
ID (la identidad del personaje): guarda una leve correlación inversa con ALIGN (bando: bueno, malo, etc.) y EYE, parece ser que la identidad del personaje tiene cierta inferencia en su color de ojos y el bando , al que pertenece, también tiene una baja correlación positiva con APPEARANCES.
EYE: con HAIR guardan una leve correlación positiva. parece haber cierta tendencia a una asociación de color de ojos y cabellos, también, EYE y SEX tienen una correlación positiva que podría indicar cierta tendencia a un color de ojos predominante para cada sexo. Esto podría ser explorado con reglas de asociación. Con APPEARANCES guarda una correlación inversa, se puede inferir que la cantidad de apariciones del personaje está relacionada con el color de los ojos.
-HAIR: tiene una correlación positiva muy baja con SEX. podría indicar una tendencia entre el color de cabello y el sexo del personaje
-SEX muestra una correlación inversa con YEAR, esto denota que a través del tiempo se han dado cambios en la cantidad de personajes de cada sexo.
APPEARANCES (la cantidad de apariciones del personaje) guarda una correlación inversa con el año de aparición del personaje, lo cual puede sonar lógico, mientras más tiempo tiene un personaje, es más probable que acumule más apariciones.
Se puede observar que la correlación es prácticamente nula en el resto de las variables, esto tendrá un impacto en los modelos de clasificación o regresión que se realicen.
En esta sección realizaremos un análisis de la correlación dentro de cada conjunto de datos, para identificar las tendencias dentro de cada uno de estos.
marvelcorrelation<-marvel[,-13:-20]
marvelcorrelation$name<-NULL
marvelcorrelation$urlslug<-NULL
marvelcorrelation$ID<-as.numeric(marvelcorrelation$ID)
marvelcorrelation$ALIGN<-as.numeric(marvelcorrelation$ALIGN)
marvelcorrelation$SEX<-as.numeric(marvelcorrelation$SEX)
marvelcorrelation$GSM<-as.numeric(marvelcorrelation$GSM)
marvelcorrelation$HAIR<-as.numeric(marvelcorrelation$HAIR)
marvelcorrelation$EYE<-as.numeric(marvelcorrelation$EYE)
marvelcorrelation$ALIVE<-as.numeric(marvelcorrelation$ALIVE)
cor(marvelcorrelation)## page_id ID ALIGN EYE HAIR
## page_id 1.000000000 -0.148256447 0.015490304 0.12248903 -0.005450832
## ID -0.148256447 1.000000000 -0.165498086 -0.06094025 -0.041063407
## ALIGN 0.015490304 -0.165498086 1.000000000 -0.03526538 0.037643674
## EYE 0.122489027 -0.060940251 -0.035265378 1.00000000 0.233443620
## HAIR -0.005450832 -0.041063407 0.037643674 0.23344362 1.000000000
## SEX 0.058962793 -0.001367267 -0.105289720 0.11398073 0.075561242
## GSM -0.019653768 0.010953716 0.010225604 -0.05039580 -0.020057982
## ALIVE 0.007782404 -0.051231061 0.096910812 0.06307157 0.046200631
## APPEARANCES -0.150845593 0.011597851 0.002093302 -0.13055399 -0.025285545
## Year -0.050244016 0.059506455 0.144493094 -0.08775530 0.028933736
## SEX GSM ALIVE APPEARANCES Year
## page_id 0.058962793 -0.019653768 0.007782404 -0.150845593 -0.050244016
## ID -0.001367267 0.010953716 -0.051231061 0.011597851 0.059506455
## ALIGN -0.105289720 0.010225604 0.096910812 0.002093302 0.144493094
## EYE 0.113980730 -0.050395804 0.063071568 -0.130553992 -0.087755302
## HAIR 0.075561242 -0.020057982 0.046200631 -0.025285545 0.028933736
## SEX 1.000000000 -0.017881703 -0.037932541 -0.018331151 -0.153905782
## GSM -0.017881703 1.000000000 -0.008561944 -0.017543120 -0.002223035
## ALIVE -0.037932541 -0.008561944 1.000000000 0.027696306 0.049870940
## APPEARANCES -0.018331151 -0.017543120 0.027696306 1.000000000 -0.080961048
## Year -0.153905782 -0.002223035 0.049870940 -0.080961048 1.000000000
En el diagrama escogido para representar la correlación, los PIE CHARTS representan la “fuerza” de correlación de una variable con el resto. de lo cual se puede observar que las correlaciones son prácticamente iguales que en el DATASET de “DC”.
Luego del análisis de correlaciones, se puede observar que ambos DATASETS se comportan de forma muy similar. por lo que se procederá a la unión de ambos, para realizar un análisis exploratorio de los datos y posterior contraste.
#################################################################
################INICIO DE JOIN DE DATASETS ######################
#################################################################
#HOMOGENIZACION DE NOMBRES DE VARIABLES
names(marvel) <- names(dc)
#JOIN DE DATAFRAMES MARVEL Y DC
dc$BRAND<-'DC'
marvel$BRAND<-'MARVEL'
allcomics<-rbind(dc,marvel)Es necesario que el nuevo conjunto de datos tenga un orden aleatorio, para que durante la creación de los modelos, estos no se vean influenciados o desbalanceados por un mal training. Para ello, usaremos la función de SAMPLE.
## page_id name urlslug
## Min. : 1025 Length:22242 Length:22242
## 1st Qu.: 29200 Class :character Class :character
## Median :186200 Mode :character Mode :character
## Mean :247012
## 3rd Qu.:442331
## Max. :755278
##
## ID ALIGN
## Identity Unknown : 9 Bad Characters :9280
## NOT SPECIFIED :5536 Good Characters :7080
## Public Identity :6756 Neutral Characters:2621
## Secret Identity :8328 NOT SPECIFIED :3258
## Known to Authorities Identity: 15 Reformed Criminals: 3
## No Dual Identity :1598
##
## EYE HAIR SEX
## NOT SPECIFIED:12856 NOT SPECIFIED:6194 Female Characters: 5539
## Blue Eyes : 2927 Black Hair :5095 Male Characters :16703
## Brown Eyes : 2677 Brown Hair :3367
## Black Eyes : 915 Blond Hair :2217
## Green Eyes : 862 No Hair :1118
## Red Eyes : 684 Red Hair :1056
## (Other) : 1321 (Other) :3195
## GSM ALIVE APPEARANCES
## Heterosexual Characters:22041 Deceased Characters: 5283 Min. : 1.00
## Homosexual Characters : 112 Living Characters :16959 1st Qu.: 2.00
## Agender Characters : 55 Median : 4.00
## Bisexual Characters : 27 Mean : 19.42
## Genderfluid Characters : 3 3rd Qu.: 14.00
## Transgender Characters : 2 Max. :4043.00
## (Other) : 2
## YEAR NAME.LENGTH URL.LENGTH FECHA.APARICION
## Min. :1935 Min. : 4.00 Min. : 6.00 Min. :1935-10-01
## 1st Qu.:1976 1st Qu.:20.00 1st Qu.:24.00 1st Qu.:1976-06-01
## Median :1990 Median :24.00 Median :27.00 Median :1990-11-01
## Mean :1986 Mean :23.99 Mean :27.84 Mean :1986-11-12
## 3rd Qu.:2001 3rd Qu.:27.00 3rd Qu.:31.00 3rd Qu.:2001-08-01
## Max. :2013 Max. :69.00 Max. :71.00 Max. :2013-10-01
##
## ANIOS.DESDE.APARICION MES.APARICION TRIMESTRE.APARICION DECADA.APARICION
## Min. : 6.00 diciembre : 2048 Min. :1.000 Min. :1930
## 1st Qu.:18.00 agosto : 2046 1st Qu.:2.000 1st Qu.:1970
## Median :29.00 octubre : 2026 Median :3.000 Median :1990
## Mean :32.85 septiembre: 1955 Mean :2.553 Mean :1982
## 3rd Qu.:43.00 junio : 1920 3rd Qu.:4.000 3rd Qu.:2000
## Max. :84.00 noviembre : 1845 Max. :4.000 Max. :2010
## (Other) :10402
## MEDIA.APARICIONES.ANIO BRAND
## Min. : 0.0119 Length:22242
## 1st Qu.: 0.0625 Class :character
## Median : 0.1739 Mode :character
## Mean : 0.5948
## 3rd Qu.: 0.5000
## Max. :75.6364
##
Es necesario homogenizar la información, ya que ciertas variables contienen sinónimos que es necesario reducir para mejorar el análisis de los datos.
#################################################################
#########INICIO DE HOMOGENIZACION DE FACTORES ###################
#################################################################
allcomics$BRAND<-factor(allcomics$BRAND)
levels(allcomics$BRAND)## [1] "DC" "MARVEL"
## [1] "Identity Unknown" "NOT SPECIFIED"
## [3] "Public Identity" "Secret Identity"
## [5] "Known to Authorities Identity" "No Dual Identity"
## [1] "Bad Characters" "Good Characters" "Neutral Characters"
## [4] "NOT SPECIFIED" "Reformed Criminals"
## [1] "Amber Eyes" "Black Eyes" "Blue Eyes"
## [4] "Brown Eyes" "Gold Eyes" "Green Eyes"
## [7] "Grey Eyes" "Hazel Eyes" "NOT SPECIFIED"
## [10] "Orange Eyes" "Photocellular Eyes" "Pink Eyes"
## [13] "Purple Eyes" "Red Eyes" "Violet Eyes"
## [16] "White Eyes" "Yellow Eyes" "Black Eyeballs"
## [19] "Compound Eyes" "Magenta Eyes" "Multiple Eyes"
## [22] "No Eyes" "One Eye" "Silver Eyes"
## [25] "Variable Eyes" "Yellow Eyeballs"
## [1] "Auburn Hair" "Black Hair" "Blond Hair"
## [4] "Blue Hair" "Brown Hair" "Gold Hair"
## [7] "Green Hair" "Grey Hair" "NOT SPECIFIED"
## [10] "Orange Hair" "Pink Hair" "Platinum Blond Hair"
## [13] "Purple Hair" "Red Hair" "Reddish Brown Hair"
## [16] "Silver Hair" "Strawberry Blond Hair" "Violet Hair"
## [19] "White Hair" "Bald" "Bronze Hair"
## [22] "Dyed Hair" "Light Brown Hair" "Magenta Hair"
## [25] "No Hair" "Orange-brown Hair" "Reddish Blond Hair"
## [28] "Variable Hair" "Yellow Hair"
## [1] "Agender Characters" "Bisexual Characters"
## [3] "Genderfluid Characters" "Heterosexual Characters"
## [5] "Homosexual Characters" "Pansexual Characters"
## [7] "Transgender Characters" "Transvestites"
allcomics$GSM <- as.character(allcomics$GSM) #ELIMINACION DE FACTOR PARA PODER EDITAR LOS VALORES DE LA COLUMNA
allcomics$GSM[allcomics$GSM=='Transvestites'] <- 'Transvestites Characters'
allcomics$GSM <- factor (allcomics$GSM) #RECONVERSION A FACTOR
which(is.na(allcomics))## integer(0)
Estableceremos la correlación para el conjunto de datos que contiene los COMICS de ambas casas comerciales.
#################################################################
#############INICIO CORRELACION DE VARIABLES#####################
#################################################################
allcomicscorrelation<-allcomics[,-13:-20]
allcomicscorrelation$ID<-as.numeric(allcomicscorrelation$ID)
allcomicscorrelation$ALIGN<-as.numeric(allcomicscorrelation$ALIGN)
allcomicscorrelation$SEX<-as.numeric(allcomicscorrelation$SEX)
allcomicscorrelation$GSM<-as.numeric(allcomicscorrelation$GSM)
allcomicscorrelation$HAIR<-as.numeric(allcomicscorrelation$HAIR)
allcomicscorrelation$EYE<-as.numeric(allcomicscorrelation$EYE)
allcomicscorrelation$ALIVE<-as.numeric(allcomicscorrelation$ALIVE)
corrgram(allcomicscorrelation, order=NULL, lower.panel=panel.shade, upper.panel=panel.pie, text.panel=panel.txt, main="Correlación del Dataset de todos los Comics")#################################################################
################FIN CORRELACION DE VARIABLES#####################
#################################################################Como conclusión, la matriz de correlación de todos los comics, tiene el siguiente comportamiento:
PAGE_ID: guarda cierta correlación con ID (tipo de identidad del personaje), EYE (color de ojos), y SEX del personaje, y negativa con APPEARANCES. Esto puede deberse a como están agrupados los personajes en el sitio web de la WIKIA.
ID (la identidad del personaje): guarda una leve correlación inversa con ALIGN (bando: bueno, malo, etc.), y con EYE, denotando cierta relación entre la identidad del personaje con el color de los ojos y el bando al que pertenece.
EYE: con HAIR guardan una correlación positiva. parece haber cierta tendencia a una asociación de color de ojos y cabellos, también, con SEX tiene una correlación positiva que podría indicar cierta tendencia a un color de ojos predominante para cada sexo. Esto podría ser explorado con reglas de asociación. Con APPEARANCES guarda una correlación inversa, se puede inferir que la cantidad de apariciones del personaje está relacionada con el color de los ojos.
HAIR: tiene una correlación positiva con SEX. podría indicar una tendencia entre el color de cabello y el sexo del personaje
SEX muestra una correlación inversa con YEAR, esto denota que a través del tiempo se han dado cambios en la cantidad de personajes de cada sexo.
GSM muestra correlaciones inversas con EYE y HAIR, puede denotar que los personajes con GENEROS ALTERNATIVOS tienen ciertas características EYE y HAIR distintivas.
APPEARANCES (la cantidad de apariciones del personaje) guarda una correlación inversa con el año de aparición del personaje, lo cual puede sonar lógico, mientras más tiempo tiene un personaje, es más probable que acumule más apariciones.
Se puede observar que la correlación es prácticamente nula en el resto de las variables, esto tendrá un impacto en los modelos de clasificación o regresión que se realicen.
El conjunto de datos tiene varias dimensiones sobre las cuales podemos mostrar los datos, así que, los hemos divido según la relevancia que pueden tener para algún fan de los cómics. Previo a ello, crearemos unos subconjuntos de datos que nos permitan establecer rankings y agrupaciones, de forma que podamos mostrar los datos de forma resumida, así como, unos gráficos iniciales que nos permitan comprender como está formado el DATASET: ALL COMICS.
topcomicsPerYear<-allcomics %>%
arrange(desc(MEDIA.APARICIONES.ANIO)) %>%
head(10)
topcomics<-allcomics %>%
arrange(desc(APPEARANCES)) %>%
head(10)
oldestcomics<-allcomics %>%
arrange(YEAR) %>%
head(10)
marcas <- allcomics %>%
group_by(BRAND) %>%
count(BRAND, sort = TRUE, name = "count")
bandos <- allcomics %>%
count(ALIGN, sort = TRUE, name = "count")
sexo <- allcomics %>%
group_by(SEX) %>%
count(SEX, sort = TRUE, name = "count")
generos <- allcomics %>%
group_by(GSM) %>%
count(GSM, sort = TRUE, name = "count")
caracteristicas <- allcomics %>%
group_by(EYE,HAIR) %>%
count(EYE, sort = TRUE, name = "count")
generosalt <- allcomics %>%
filter(GSM!="Heterosexual Characters") %>%
group_by(GSM) %>%
count(GSM, sort = TRUE, name = "count")
sexo_personajes <- allcomics %>%
group_by(BRAND,DECADA.APARICION,SEX,GSM) %>%
summarize(totalAppearances = sum(as.numeric(APPEARANCES)),
meanAppearances = mean(APPEARANCES))Estos gráficos sirven para entender como están distribuidos los datos en el conjunto de datos de todos los comics. El primer gráfico muestra, la relación entre MARVEL y DC Comics, como se aprecia, es casi de 3 a 1.
La composición de personajes se divide prácticamente en un 75% masculino y un 25% femenino. y la distribución en cada una de las marcas parece guardar proporciones similares (3 a 1).
La composición de personajes del tipo BAD CHARACTERS (Villano), es predominante sobre GOOD CHARACTERS (Héroes), sin embargo, hay un número significativo de personajes del tipo NEUTRAL, y muchos NOT SPECIFIED. Los personajes que se han convertido al bando de héroes (REFORMED CRIMINALS), es minúsculo, considerando el tamaño del DATASET.
La composición de géneros de los cómics es predominantemente HETEROSEXUAL, por lo que es necesario filtrar esta categoría para poder analizar los géneros alternativos de los personajes.
La composición de GÉNEROS ALTERNATIVOS de personajes es principalmente HOMOSEXUAL, AGENDER, Y BISEXUAL
En este gráfico se puede observar el impacto de la II Guerra Mundial, en la industria del comic: entre 1940 y 1950 se dio una importante reducción en la aparición de nuevos personajes. Varias años después, luego de la guerra, cada una de las marcas de cómics, tienen una explosión demográfica acentuada a partir de la década de los 60´s.
Podemos observar que ambas marcas dan casi la misma importancia a la aparición de personajes de géneros alternativos (Guardando la relación sobre la cantidad de personajes que cada una tiene). Si acaso cabe resaltar, los géneros que utiliza MARVEL Cómics suelen ser más diversos: Pansexual, Transexuales, etc., mientras que DC se encasilla en los tradicionales: Homosexual y Bisexual.
Este gráfico nos permite observar cómo cada marca ha empezado a lanzar sus personajes según cada género, de lo cual: - DC, a pesar de tener un corte más conservador, es pionera en la incursión personajes del tipo BISEXUAL, aunque su frecuencia no empieza sino hasta los años 80´s - MARVEL, casi desde el inicio ha incluido personajes del tipo HOMOSEXUAL, dentro de sus cómics. No es sino hasta los años 70’s, que empiezan a incluirse más personajes de este género.
Aquí podemos observar cómo se distribuyen los géneros alternativos acorde al sexo. En las categorías HOMOSEXUAL, GENDERFLUID, TRANSVESTITES y AGENDER predomina el masculino, mientras que, en BISEXUAL, PANSEXUAL, TRANSGENDER predomina el femenino.
Este apartado contiene gráficos relacionados a la cantidad de apariciones de los personajes de cada marca de cómic.
En el primer gráfico, observamos el TOP 10 de personajes con mayores apariciones en toda la historia. Podemos observar la clara predominancia de MARVEL (8) contra DC (2).
Luego podemos ver la distribución de estos personajes por SEXO y BANDO, observando que todos son MALE y la mayoría héroes (GOOD CHARACTERS)
Este gráfico nos permite apreciar el TOP 10 de los personajes que tienen mayo recurrencia anual, aquí podemos observar que los principales personajes de ambas casas MARVEL (6), y DC (4), hacen casi el mismo número de apariciones anuales en promedio.
El siguiente gráfico permite observar el promedio de apariciones de un personaje según el SEXO, se aprecia que el promedio para personajes FEMALE es menor en DC, pero superior en MARVEL.
Este gráfico en cambio nos permite ver el promedio de apariciones de un personaje según su GÉNERO, llama la atención que el género TRANSVESTITES tenga el mayor promedio, y esto se debe a que es un único personaje de este tipo, con un alto número de apariciones (500+).
Para entender mejor el gráfico anterior, se presenta una alternativa que nos permite observar este fenómeno de la aparición de personajes a través del tiempo. En este gráfico. se observa CADA GENERO, con la SUMA DE APARICIONES en cada DECADA, se puede observar - Las apariciones de personajes del tipo HOMOSEXUAL se mantienen desde 1940, sin tener incrementos significativos. - Las apariciones de tipo BISEXUAL incrementaron en los 60´s y se encuentran en declive - Las apariciones de AGENDER se mantienen. - Los de género HETEROSEXUAL DE 1960, son los personajes con mayores números de apariciones de la historia.
Podemos analizar mejor los géneros si excluimos al Heterosexual. ya que su presencia en el gráfico distorsiona las dimensiones de los géneros alternativos. En este gráfico, podemos observar que si bien es cierto ambas marcas son inclusivas, MARVEL suele dar mayor cantidad de apariciones a sus personajes de género alternativo, e incluso con mayor diversidad.
El primer gráfico representa los 10 personajes más antiguos del conjunto de datos, se puede observar que todos pertenecen a la marca DC comics.
En un gráfico de la distribución por SEXO de estos personajes, vemos que la gran mayoría son MALE CHARACTERS (hombres).
Este gráfico, nos permite observar que la cantidad de apariciones de personajes según el SEXO y la marca a través del tiempo.
En ambas marcas, hay tendencias similares a la aparición de personajes para ambos sexos.
En este gráfico, podemos observar que:
En este gráfico, expande un poco lo observado en el anterior, agregando la dimensión del sexo. Podemos ver que tanto en DC como en MARVEL, los villanos suelen ser MALE CHARACTERS (hombres), y confirmamos que en MARVEL la cantidad de villanos excede con creces a los héroes.
Este gráfico, nos permite ver las combinaciones de características físicas (HAIR y EYE) predominantes. Las combinaciones más frecuentes son:
Para responder a esta pregunta, se utilizará el algoritmo A PRIORI, buscando patrones de las siguientes características:
Para depurar los antecedentes no deseados: (categorías vacias: NOT SPECIFIED) y consecuentes obvios (categorías con más del 70% de frecuencia: Marvel, Male, Heterosexual), utilizaremos un ciclo FOR, para cargar la lista de elementos sobre la cual buscaremos las reglas existentes.
#Nos creamos todas las combinaciones de atributos para seleccionar solo los que nos interesen más
factores<-c(sapply(allcomics_aso, levels))
i=0
l<-c()
for(factor in factores)
{
i=i+1
atrib=names(factores)[i]
for(elemento in factor)
{
if(elemento!="MARVEL" && elemento!="NOT SPECIFIED" && elemento!="Heterosexual Characters" && elemento!="Male Characters"){
l<-c(l,paste(atrib,"=",elemento,sep = ""))
}
}
}
#detach("package:arulesViz", unload=TRUE)
#detach("package:arules", unload=TRUE)
#search()
#unloadNamespace("arules")
#update.packages("arules") Ejecutamos el algoritmo A PRIORI.
reglas <- apriori(allcomics_aso, parameter = list(minlen=1, supp=soporte, conf=confianza), appearance = list(both=l), control = list(verbose=F))
reglas<-subset(reglas, subset = lift > umbral_lift)
reglas.ord <- sort(reglas, by="support")
inspect(reglas.ord)## lhs rhs support confidence lift count
## [1] {DECADA.APARICION=1990} => {ALIVE=Living Characters} 0.19517130 0.8067274 1.058036 4341
## [2] {ID=Public Identity,
## ALIGN=Good Characters} => {ALIVE=Living Characters} 0.10322813 0.8153409 1.069333 2296
## [3] {ALIGN=Good Characters,
## SEX=Female Characters} => {ALIVE=Living Characters} 0.08735725 0.8229564 1.079320 1943
Revisamos la existencia de reglas redundantes (aquellas que son subconjunto de otra).
## 3 x 3 sparse Matrix of class "ngCMatrix"
## {ALIVE=Living Characters,DECADA.APARICION=1990}
## {ALIVE=Living Characters,DECADA.APARICION=1990} |
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters} .
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters} .
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters}
## {ALIVE=Living Characters,DECADA.APARICION=1990} .
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters} |
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters} .
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters}
## {ALIVE=Living Characters,DECADA.APARICION=1990} .
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters} .
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters} |
## 3 x 3 sparse Matrix of class "dgCMatrix"
## {ALIVE=Living Characters,DECADA.APARICION=1990}
## {ALIVE=Living Characters,DECADA.APARICION=1990} 1
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters} .
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters} .
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters}
## {ALIVE=Living Characters,DECADA.APARICION=1990} .
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters} 1
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters} .
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters}
## {ALIVE=Living Characters,DECADA.APARICION=1990} .
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters} .
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters} 1
Podemos observar que dentro de las reglas detectadas no hay reglas redundantes (ninguna tiene el valor TRUE, en la matriz de búsqueda de redundancia, al menos de las reglas encontradas con los valores de confianza y soporte previamente definidos).
## {ALIVE=Living Characters,DECADA.APARICION=1990}
## FALSE
## {ID=Public Identity,ALIGN=Good Characters,ALIVE=Living Characters}
## FALSE
## {ALIGN=Good Characters,SEX=Female Characters,ALIVE=Living Characters}
## FALSE
Podemos observar que dentro de las reglas detectadas no hay reglas redundantes (con los valores de confianza y soporte previamente definidos.)
## lhs rhs support confidence lift count
## [1] {DECADA.APARICION=1990} => {ALIVE=Living Characters} 0.19517130 0.8067274 1.058036 4341
## [2] {ID=Public Identity,
## ALIGN=Good Characters} => {ALIVE=Living Characters} 0.10322813 0.8153409 1.069333 2296
## [3] {ALIGN=Good Characters,
## SEX=Female Characters} => {ALIVE=Living Characters} 0.08735725 0.8229564 1.079320 1943
Gráficamente podemos observar las reglas y consecuentes expuestos anteriormente.
par(mfrow=c(4,1))
plot(reglas.dep,method="graph")
plot(reglas.dep[1,],method="paracoord")
plot(reglas.dep[2,],method="paracoord")
plot(reglas.dep[3,],method="paracoord")A través de un modelo de regresión, del tipo RANDOM FOREST, procederemos a predecir la cantidad de apariciones de un personaje, basándonos en varias variables del conjunto de datos, tales como la fecha de aparición del personaje, las características físicas, la longitud del nombre, y la marca.
El primer paso es graficar las dimensiones de la variable a predecir APPEARANCES, para tener una mejor idea de su comportamiento.
Se puede observar que hay cierta correlación negativa, que indica que mientras más antiguo es el personaje, es más probable que tenga un mayor número de apariciones.
Una vez que tenemos una idea del comportamiento de la variable APPEARANCES, convertimos el formato del resto de variables a numérico, para que pueda ser utilizado por el algoritmo RF.
## integer(0)
## 'data.frame': 22242 obs. of 21 variables:
## $ page_id : int 625370 18334 507238 148422 730519 5686 198565 274473 27061 128545 ...
## $ name : chr "Jonath (Earth-616)" "Crazy Legs (Earth-616)" "Vyr'tal (Earth-616)" "Cinderblock (New Earth)" ...
## $ urlslug : chr "\\/Jonath_(Earth-616)" "\\/Crazy_Legs_(Earth-616)" "\\/Vyr%27tal_(Earth-616)" "\\/wiki\\/Cinderblock_(New_Earth)" ...
## $ ID : Factor w/ 6 levels "Identity Unknown",..: 3 4 3 4 3 4 3 3 4 3 ...
## $ ALIGN : Factor w/ 5 levels "Bad Characters",..: 3 4 2 1 4 2 1 1 1 1 ...
## $ EYE : Factor w/ 26 levels "Amber Eyes","Black Eyes",..: 9 9 16 17 9 4 3 9 3 2 ...
## $ HAIR : Factor w/ 29 levels "Auburn Hair",..: 9 5 9 9 3 2 14 9 5 5 ...
## $ SEX : Factor w/ 2 levels "Female Characters",..: 2 2 2 2 2 1 2 2 2 2 ...
## $ GSM : Factor w/ 8 levels "Agender Characters",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ ALIVE : Factor w/ 2 levels "Deceased Characters",..: 2 2 2 2 2 2 2 1 2 2 ...
## $ APPEARANCES : num 18 4 18 1 1 42 26 25 1 14 ...
## $ YEAR : int 1996 1987 2007 2009 1973 1998 1987 1991 1998 1997 ...
## $ NAME.LENGTH : int 18 22 19 23 27 39 29 29 24 27 ...
## $ URL.LENGTH : int 20 24 23 31 29 41 37 39 26 35 ...
## $ FECHA.APARICION : Date, format: "1996-02-01" "1987-08-01" ...
## $ ANIOS.DESDE.APARICION : num 24 32 12 10 46 21 32 28 21 22 ...
## $ MES.APARICION : Ord.factor w/ 12 levels "enero"<"febrero"<..: 2 8 12 11 11 9 5 8 7 8 ...
## $ TRIMESTRE.APARICION : int 1 3 4 4 4 3 2 3 3 3 ...
## $ DECADA.APARICION : num 1990 1980 2000 2000 1970 1990 1980 1990 1990 1990 ...
## $ MEDIA.APARICIONES.ANIO: num 0.75 0.125 1.5 0.1 0.0217 ...
## $ BRAND : Factor w/ 2 levels "DC","MARVEL": 2 2 2 1 2 2 1 1 2 1 ...
allcomics_ML <-allcomics
allcomics_ML$FECHA.APARICION<-factor(allcomics_ML$FECHA.APARICION)
allcomics_ML$FECHA.APARICION<-as.numeric(allcomics_ML$FECHA.APARICION)
allcomics_ML$ID<-as.numeric(allcomics_ML$ID)
allcomics_ML$ALIGN<-as.numeric(allcomics_ML$ALIGN)
allcomics_ML$EYE<-as.numeric(allcomics_ML$EYE)
allcomics_ML$HAIR<-as.numeric(allcomics_ML$HAIR)
allcomics_ML$SEX<-as.numeric(allcomics_ML$SEX)
allcomics_ML$GSM<-as.numeric(allcomics_ML$GSM)
allcomics_ML$ALIVE<-as.numeric(allcomics_ML$ALIVE)
allcomics_ML$MES.APARICION<-as.numeric(allcomics_ML$MES.APARICION)
allcomics_ML$BRAND<-as.numeric(allcomics_ML$BRAND)Para evitar que las escalas creen un sesgo en el modelo, es conveniente transformar los valores a escala logarítmica
allcomics_ML <- mutate(allcomics_ML,
page_id = log10(page_id + 1),
ID = log10(ID + 1),
ALIGN = log10(ALIGN + 1),
EYE = log10(EYE + 1),
HAIR = log10(HAIR + 1),
SEX = log10(SEX + 1),
GSM = log10(GSM + 1),
ALIVE = log10(ALIVE + 1),
APPEARANCES = log10(APPEARANCES + 1),
YEAR = log10(YEAR + 1),
NAME.LENGTH = log10(NAME.LENGTH + 1),
URL.LENGTH = log10(URL.LENGTH + 1),
FECHA.APARICION = log10(FECHA.APARICION + 1),
ANIOS.DESDE.APARICION = log10(ANIOS.DESDE.APARICION + 1),
MES.APARICION = log10(MES.APARICION + 1),
TRIMESTRE.APARICION = log10(TRIMESTRE.APARICION + 1),
DECADA.APARICION = log10(DECADA.APARICION + 1),
BRAND = log10(BRAND + 1))Revisamos la estructura del DATASET, para depurar y eliminar aquellas variables incompatibles (tipo character) o aquellas que son redundantes, y las que hemos calculado durante el análisis exploratorio que harían trivial la predicción (Por ejemplo: Media de Apariciones por Año.)
## 'data.frame': 22242 obs. of 21 variables:
## $ page_id : num 5.8 4.26 5.71 5.17 5.86 ...
## $ name : chr "Jonath (Earth-616)" "Crazy Legs (Earth-616)" "Vyr'tal (Earth-616)" "Cinderblock (New Earth)" ...
## $ urlslug : chr "\\/Jonath_(Earth-616)" "\\/Crazy_Legs_(Earth-616)" "\\/Vyr%27tal_(Earth-616)" "\\/wiki\\/Cinderblock_(New_Earth)" ...
## $ ID : num 0.602 0.699 0.602 0.699 0.602 ...
## $ ALIGN : num 0.602 0.699 0.477 0.301 0.699 ...
## $ EYE : num 1 1 1.23 1.26 1 ...
## $ HAIR : num 1 0.778 1 1 0.602 ...
## $ SEX : num 0.477 0.477 0.477 0.477 0.477 ...
## $ GSM : num 0.699 0.699 0.699 0.699 0.699 ...
## $ ALIVE : num 0.477 0.477 0.477 0.477 0.477 ...
## $ APPEARANCES : num 1.279 0.699 1.279 0.301 0.301 ...
## $ YEAR : num 3.3 3.3 3.3 3.3 3.3 ...
## $ NAME.LENGTH : num 1.28 1.36 1.3 1.38 1.45 ...
## $ URL.LENGTH : num 1.32 1.4 1.38 1.51 1.48 ...
## $ FECHA.APARICION : num 2.83 2.76 2.91 2.92 2.61 ...
## $ ANIOS.DESDE.APARICION : num 1.4 1.52 1.11 1.04 1.67 ...
## $ MES.APARICION : num 0.477 0.954 1.114 1.079 1.079 ...
## $ TRIMESTRE.APARICION : num 0.301 0.602 0.699 0.699 0.699 ...
## $ DECADA.APARICION : num 3.3 3.3 3.3 3.3 3.29 ...
## $ MEDIA.APARICIONES.ANIO: num 0.75 0.125 1.5 0.1 0.0217 ...
## $ BRAND : num 0.477 0.477 0.477 0.301 0.477 ...
## page_id name urlslug ID
## Min. :3.011 Length:22242 Length:22242 Min. :0.3010
## 1st Qu.:4.465 Class :character Class :character 1st Qu.:0.6021
## Median :5.270 Mode :character Mode :character Median :0.6021
## Mean :5.012 Mean :0.6247
## 3rd Qu.:5.646 3rd Qu.:0.6990
## Max. :5.878 Max. :0.8451
## ALIGN EYE HAIR SEX
## Min. :0.3010 Min. :0.3010 Min. :0.3010 Min. :0.3010
## 1st Qu.:0.3010 1st Qu.:0.6990 1st Qu.:0.6021 1st Qu.:0.4771
## Median :0.4771 Median :1.0000 Median :0.9542 Median :0.4771
## Mean :0.4509 Mean :0.8992 Mean :0.8592 Mean :0.4333
## 3rd Qu.:0.6021 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.4771
## Max. :0.7782 Max. :1.4314 Max. :1.4771 Max. :0.4771
## GSM ALIVE APPEARANCES YEAR
## Min. :0.3010 Min. :0.3010 Min. :0.3010 Min. :3.287
## 1st Qu.:0.6990 1st Qu.:0.4771 1st Qu.:0.4771 1st Qu.:3.296
## Median :0.6990 Median :0.4771 Median :0.6990 Median :3.299
## Mean :0.6981 Mean :0.4353 Mean :0.8301 Mean :3.298
## 3rd Qu.:0.6990 3rd Qu.:0.4771 3rd Qu.:1.1761 3rd Qu.:3.301
## Max. :0.9542 Max. :0.4771 Max. :3.6068 Max. :3.304
## NAME.LENGTH URL.LENGTH FECHA.APARICION ANIOS.DESDE.APARICION
## Min. :0.699 Min. :0.8451 Min. :0.301 Min. :0.8451
## 1st Qu.:1.322 1st Qu.:1.3979 1st Qu.:2.638 1st Qu.:1.2788
## Median :1.398 Median :1.4472 Median :2.784 Median :1.4771
## Mean :1.389 Mean :1.4517 Mean :2.675 Mean :1.4583
## 3rd Qu.:1.447 3rd Qu.:1.5051 3rd Qu.:2.867 3rd Qu.:1.6435
## Max. :1.845 Max. :1.8573 Max. :2.944 Max. :1.9294
## MES.APARICION TRIMESTRE.APARICION DECADA.APARICION MEDIA.APARICIONES.ANIO
## Min. :0.3010 Min. :0.3010 Min. :3.286 Min. : 0.0119
## 1st Qu.:0.6990 1st Qu.:0.4771 1st Qu.:3.295 1st Qu.: 0.0625
## Median :0.9031 Median :0.6021 Median :3.299 Median : 0.1739
## Mean :0.8276 Mean :0.5265 Mean :3.297 Mean : 0.5948
## 3rd Qu.:1.0414 3rd Qu.:0.6990 3rd Qu.:3.301 3rd Qu.: 0.5000
## Max. :1.1139 Max. :0.6990 Max. :3.303 Max. :75.6364
## BRAND
## Min. :0.3010
## 1st Qu.:0.3010
## Median :0.4771
## Mean :0.4242
## 3rd Qu.:0.4771
## Max. :0.4771
#REMOCION DE VARIABLES REDUNDANTES Y DE AQUELLAS QUE NO TIENEN RELEVANCIA EN LA PREDICCION DE LAS APARICIONES
allcomics_ML[ ,c('name','urlslug','MEDIA.APARICIONES.ANIO','ANIOS.DESDE.APARICION','MES.APARICION','DECADA.APARICION','YEAR','GSM','ALIVE')] <- list(NULL)Dividimos el conjunto de datos en TRAIN y TEST, usando la función SAMPLE y la regla del 80/20.
set.seed(123) # set seed to ensure you always have same random numbers generated
sample = sample.split(allcomics_ML,SplitRatio = 0.8) # splits the data in the ratio mentioned in SplitRatio. After splitting marks these rows as logical TRUE and the the remaining are marked as logical FALSE
train =subset(allcomics_ML,sample ==TRUE) # creates a training dataset named train1 with rows which are marked as TRUE
test=subset(allcomics_ML, sample==FALSE)
test$APARICIONES.ORIGINALES <- test$APPEARANCES
test[ ,c('APPEARANCES')] <- list(NULL)Creamos el modelo de predicción de las apariciones con RF.
set.seed(222)
rf_model <- randomForest(APPEARANCES ~ .,
data = train,
ntree = 501,
replace = TRUE,
nodesize = 9,
importance = TRUE); print(rf_model)##
## Call:
## randomForest(formula = APPEARANCES ~ ., data = train, ntree = 501, replace = TRUE, nodesize = 9, importance = TRUE)
## Type of random forest: regression
## Number of trees: 501
## No. of variables tried at each split: 3
##
## Mean of squared residuals: 0.1222302
## % Var explained: 52.78
Conclusión
Se puede predecir la cantidad de apariciones con una precisión ACEPTABLE, ya que el modelo tiene las siguientes medidas de bondad:
Esto se debe a que las variables predictoras muestran bajas correlaciones que no permiten que el modelo sea más preciso a la hora de pronosticar un valor.
Luego, procedemos a revisar las variables que el modelo detecto como importantes para la predicción.
# Create an object for importance of variables
importance <- importance(rf_model)
# Create data frame using importance.
varImportance <- data.frame(Variables = row.names(importance),
Importance = round(importance[,'IncNodePurity'], 0))
Imp<-varImp(rf_model,scale= FALSE)
Imp## Overall
## page_id 0.129249859
## ID 0.012254069
## ALIGN 0.020254966
## EYE 0.034919318
## HAIR 0.004779189
## SEX 0.001584426
## NAME.LENGTH 0.018231471
## URL.LENGTH 0.031086665
## FECHA.APARICION 0.038048984
## TRIMESTRE.APARICION 0.002732609
## BRAND 0.032867242
# Create interactive plot.
ggplotly(ggplot(varImportance, aes(x = reorder(Variables, Importance),
y = Importance, fill = Importance)) +
geom_bar(stat='identity') +
labs(title = 'Importancia del predictor', x = 'Predictor', y = 'RMSLE') +
coord_flip() +
theme_light())Realizamos la predicción en el conjunto de datos de TEST, posterior a ello, almacenamos las predicciones en un dataframe SOLUCION.
Es importante recordar que se debe reversar la escala logarítmica para tener el valor de apariciones predicho final. Luego se guarda en disco dicho archivo.
#se reversa la transformación logarítmica de los ingresos antes de exportar los resultados
solution <- as_tibble(solution) %>%
mutate(page_id=10^page_id,APPEARANCES.PREDICTED = ceiling(10^APPEARANCES.PREDICTED),APARICIONES.ORIGINALES = 10^APARICIONES.ORIGINALES)
solution<-merge(solution, allcomics[, c("page_id", "name")], by="page_id")
write.csv(solution, file = 'prediccion_cantidad_apariciones.csv', row.names = F)